package main

import "fmt"

// 环形链表
type CatNode struct {
	no   int
	name string
	next *CatNode
}

func main() {
	head := &CatNode{}

	cat1 := &CatNode{
		no:   1,
		name: "tom",
	}
	cat2 := &CatNode{
		no:   2,
		name: "tom2",
	}
	cat3 := &CatNode{
		no:   3,
		name: "tom3",
	}
	InsertCatNode(head, cat1)

	InsertCatNode(head, cat2)

	InsertCatNode(head, cat3)
	delCatNode(head, 20)
	ListCircleLink(head)
}

func InsertCatNode(head *CatNode, newNode *CatNode) {
	// 是不是添加第一个node
	if head.next == nil {
		head.no = newNode.no
		head.name = newNode.name
		head.next = head // 形成环形
		return
	}
	// 临时变量--找到环形最后
	temp := head
	for {
		if temp.next == head {
			break
		}
		temp = temp.next
	}
	temp.next = newNode
	newNode.next = head
}

func delCatNode(head *CatNode, id int) *CatNode {
	temp := head
	help := head
	// 空链表
	if head.next == nil {
		fmt.Println("环形链表为空")
		return head
	}
	// 只有一个节点
	if temp.next == head {
		temp.next = nil
		return head
	}
	//两个以上节点
	// help 定位到最后
	for {
		if help.next == head {
			break
		}
		help = help.next
	}

	flag := true
	for {
		if temp.next == head {
			// 比较到了最后，最后一个还没有比较
			break
		}
		if temp.no == id {
			if temp == head {
				// 删除的是头结点
				head = head.next
			}
			// head 和 help 是首尾相连的
			// 所以 吧 help 的next修改为要删除的next就可以了
			help.next = temp.next
			flag = false
			break
		}
		temp = temp.next
		help = help.next
	}
	if flag {
		// 在for 循环中没有删除
		if temp.no == id {
			help.next = temp.next
		} else {
			fmt.Println("没有该no：", id)
		}
	}
	return head
}

func ListCircleLink(head *CatNode) {
	temp := head
	if temp.next == nil {
		fmt.Println("链表为空")
		return
	}
	for {
		fmt.Println(temp, "->")
		if temp.next == head {
			break
		}
		temp = temp.next
	}
}
